home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Celestin Apprentice 5
/
Apprentice-Release5.iso
/
Source Code
/
Libraries
/
CW GUSI 1.6.4
/
Examples
/
GUSIUnixTest.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-04-17
|
4KB
|
162 lines
/*********************************************************************
File : GUSI - Grand Unified Socket Interface
File : GUSIUnixTest - Test unix domain sockets
Author : Matthias Neeracher <neeri@iis.ethz.ch>
Language : MPW C
$Log: GUSIUnixTest.c,v $
Revision 1.1 1994/02/25 02:48:37 neeri
Initial revision
Revision 0.4 1992/09/08 00:00:00 neeri
Factor out more common code
Revision 0.3 1992/07/26 00:00:00 neeri
Fixed a few minor bugs
Revision 0.2 1992/07/25 00:00:00 neeri
Adapt to new testing gear & implementation
Revision 0.1 1992/04/17 00:00:00 neeri
Handle SIOW activate/update
*********************************************************************/
#include <GUSI.h>
#include "GUSITest.h"
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include "Events.h"
extern int GUSIDefaultSpin(spin_msg, long);
void Socket(char ch1, char ch2, const char * cmd)
{
sock = socket(AF_UNIX, (ch1 == 's') ? SOCK_STREAM : SOCK_DGRAM, 0);
if (sock == -1) {
printf("# socket() returned error %s\n", Explain());
Where();
}
}
void Bind(char ch1, char ch2, const char * cmd)
{
int len;
struct sockaddr_un addr;
if (sock == -1) {
printf("# socket is not open\n");
Where();
return;
}
if (sscanf(cmd, "%s", addr.sun_path) == 1) {
addr.sun_family = AF_UNIX;
len = strlen(addr.sun_path)+2;
} else {
len = sizeof(struct sockaddr_un);
if (choose(AF_UNIX, 0, "", nil, CHOOSE_NEW, &addr, &len)) {
printf("# choose() returned error %s\n", Explain());
Where();
return;
}
}
if (bind(sock, (struct sockaddr *) &addr, len)) {
printf("bind(\"%s\") returned error %s\n", addr.sun_path, Explain());
Where();
}
}
void Accept(char ch1, char ch2, const char * cmd)
{
int len;
struct sockaddr_un addr;
if (sock == -1) {
printf("# socket is not open\n");
Where();
return;
}
if (accsock != -1) {
printf("# can't accept more than one connection\n");
Where();
return;
}
len = sizeof(struct sockaddr_un);
sock = accept(accsock = sock, (struct sockaddr *) &addr, &len);
if (sock < 0) {
printf("# accept() returned error %s\n", Explain());
sock = accsock;
accsock = -1;
} else {
addr.sun_path[len-2] = 0;
printf("# accepted connection from \"%s\"\n", addr.sun_path);
}
Where();
}
void Connect(char ch1, char ch2, const char * cmd)
{
int len;
struct sockaddr_un addr;
if (sock == -1) {
printf("# socket is not open\n");
Where();
return;
}
if (sscanf(cmd, "%s", addr.sun_path) == 1) {
addr.sun_family = AF_UNIX;
len = strlen(addr.sun_path)+2;
} else {
len = sizeof(struct sockaddr_un);
if (choose(AF_UNIX, 0, "", nil, 0, &addr, &len)) {
printf("# choose() returned error %s\n", Explain());
Where();
return;
}
}
if (connect(sock, (struct sockaddr *) &addr, len)) {
printf("connect(\"%s\") returned error %s\n", addr.sun_path, Explain());
Where();
}
}
main(int argc, char ** argv)
{
GUSISetup(GUSIwithSIOUXSockets);
GUSISetup(GUSIwithUnixSockets);
printf("GUSIUnixTest MN 16Apr95\n\n");
COMMAND('s', 's', Socket, "", "Create a stream socket");
COMMAND('d', 's', Socket, "", "Create a datagram socket");
COMMAND('b', 'd', Bind, "[filename]", "Bind to address");
COMMAND('c', 'o', Connect, "[filename]", "Connect to address");
COMMAND('a', 'c', Accept, "", "Accept a connection");
AddSocketCommands();
RunTest(argc, argv);
CleanupSockets();
}